package main

//定义一个任务类型
type Task struct {
	f func() error //业务名称
}

//创建task任务，构造器
func NewTask(arg_f func() error) *Task {
	t := Task{
		f: arg_f,
	}

	return &t
}

//Task执行业务
func (t *Task) Execute() {
	t.f() //调用业务
}

///-------------创Task完成

//-------创建协程池
type Pool struct {
	//对外的channel
	EntryChannel chan *Task
	//对内的channel
	JobsChannel chan *Task
	//最大worker数量
	worker_num int
}

//构造器
func NewPool(cap int) *Pool { //创建时传入cap容量
	//创建Pool
	p := Pool{
		EntryChannel: make(chan *Task),
		JobsChannel:  make(chan *Task),
		worker_num:   cap,
	}

	return &p
}

//协程池创建一个work并进行工作
func (p *Pool) NewWorker(worker_ID int) {
	//worker的工作
	//1.一直从JobsChannel中取任务,阻塞读
	for task := range p.JobsChannel {
		//task是当前任务
		//2.取到任务便去执行
		task.Execute()
	}
}

//协程池开始启动
func (p *Pool) run() {
	//根据num创建worker
	for i := 0; i < p.worker_num; i++ {
		go p.NewWorker(i)
	}

	//从EntryChannel中读取任务,将其放入JobsChannel
	for task := range p.EntryChannel {
		p.JobsChannel <- task
	}

}
